package ar.com.larreta.procesos;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import ar.com.larreta.comunes.Herramientas;
import ar.com.larreta.comunes.Objeto;
import ar.com.larreta.comunes.Propiedades;
import ar.com.larreta.excepciones.Excepcion;


public abstract class Paso extends Objeto {
	
	public static final String ENTIDAD = "entidad";
	public static final String ENTIDADES = "entidades";
	public static final String CRITERIA = "criteria";
	public static final String EXPRESIONES = "expresiones";
	
	protected Propiedades propiedadesDeConfiguracionDeLaAplicacion = AdministradorDeProcesos.getInstancia(null).getPropiedades();
	
	protected Map<Object, Entrada> entradas;
	protected Map salidas = new HashMap();
	protected Paso pasoAnterior;
	protected Proceso proceso; 
	
	public Proceso getProceso() {
		return proceso;
	}

	public void setProceso(Proceso proceso) {
		this.proceso = proceso;
	}

	public Paso getPasoAnterior() {
		return pasoAnterior;
	}

	public void setPasoAnterior(Paso pasoAnterior) {
		this.pasoAnterior = pasoAnterior;
	}
	
	public void ejecutar() throws Excepcion{
		logger.debug("Obteniendo valores de los parametros de entrada");
		obtenerValores();
		logger.debug("Ejecutando accion");
		accion();
	}
	
	private void obtenerValores(){
		if (entradas!=null){
			Iterator itEntradas = entradas.values().iterator();
			while (itEntradas.hasNext()) {
				Entrada entrada = (Entrada) itEntradas.next();
				if (entrada.isOrigenPedido()){
					entrada.setValor(Herramientas.valor(getProceso().getPedido(), entrada.getNombre()));
				}
				if (entrada.isOrigenPasoAnterior()){
					Map salidasPasoAnterior = getPasoAnterior().getSalidas();
					entrada.setValor(salidasPasoAnterior.get(entrada.getNombre()));
					if (entrada.esSalida()){
						salidas.put(entrada.getNombre(), entrada.getValor());
					}
				}
			}
		}
	}
	
	protected abstract void accion() throws Excepcion;
	
	public Map getEntradas() {
		return entradas;
	}

	public void setEntradas(Map entradas) {
		this.entradas = entradas;
	}

	public Map getSalidas() {
		return salidas;
	}

	public void setSalidas(Map salidas) {
		this.salidas = salidas;
	}	
	
}
